import axios from 'axios'
import { Message } from 'element-ui'
import router from '@/router'
import { getToken, removeToken, isTokenExpired } from '@/utils/auth'

// 创建axios实例
const service = axios.create({
  baseURL: '/api', // 统一使用/api作为前缀
  withCredentials: true,
  timeout: 500000
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    const token = getToken()
    if (token) {
      // 使用标准的Bearer Token格式
      config.headers['Authorization'] = `Bearer ${token}`
      
      // 同时保留token头以兼容旧后端
      config.headers['token'] = token
      
      // 检查token是否已过期
      if (isTokenExpired()) {
        console.warn('Token已过期，即将跳转到登录页')
        removeToken()
        router.replace('/login')
        return Promise.reject(new Error('Token已过期，请重新登录'))
      }
    }
    
    // 兼容API不同的调用格式
    if (config.url.includes('/users/info')) {
      // 依然为兼容某些API保留token参数
      if (config.params && config.params.token) {
        // 如果参数中有token，也同时设置标准Authorization头
        if (!config.headers['Authorization'] && token) {
          config.headers['Authorization'] = `Bearer ${token}`
        }
      }
      console.log('发送获取用户信息请求:', config)
    }
    
    return config
  },
  error => {
    console.log(error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 文件流直接返回
    if (response.config.responseType === 'blob' || response.config.responseType === 'arraybuffer') {
      return response
    }

    const res = response.data
    
    // 如果是获取用户信息接口且遇到错误
    if (response.config.url.includes('/users/info') && (response.status >= 400 || !res || res.code === 0)) {
      console.log('获取用户信息失败，但将继续使用默认信息:', response)
      // 创建一个模拟的成功响应
      return {
        data: {
          code: 1,
          msg: '模拟用户信息',
          data: {
            username: localStorage.getItem('username') || 'Guest User',
            avatar: '',
            status: 1
          }
        },
        status: 200
      }
    }

    // 未登录状态处理
    if (res.code === 0 && res.msg === 'NOT_LOGIN') {
      console.log('用户未登录, 跳转至登录页面')
      removeToken()
      
      // 显示明确的未登录提示
      Message({
        message: '请先登录',
        type: 'warning',
        duration: 2000
      })
      
      // 跳转到登录页面，并记住当前路径
      const currentPath = router.currentRoute.fullPath
      router.replace(`/login?redirect=${encodeURIComponent(currentPath)}`)
      return Promise.reject(new Error('未登录或登录已过期，请重新登录'))
    }
    
    // JWT特有：处理token过期响应
    if (res.code === 0 && (res.msg === 'TOKEN_EXPIRED' || res.msg === 'INVALID_TOKEN')) {
      console.log('Token已过期或无效, 跳转至登录页面')
      removeToken()
      
      Message({
        message: 'Token已过期，请重新登录',
        type: 'warning',
        duration: 2000
      })
      
      // 跳转到登录页面，并记住当前路径
      const currentPath = router.currentRoute.fullPath
      router.replace(`/login?redirect=${encodeURIComponent(currentPath)}`)
      return Promise.reject(new Error('Token已过期，请重新登录'))
    }
    
    // 账号状态异常处理
    if (res.code === 0 && res.msg === 'ACCOUNT_DISABLED') {
      console.log('用户账号状态异常')
      removeToken()
      router.replace('/login')
      Message({
        message: '账号状态异常，请联系管理员',
        type: 'error',
        duration: 5 * 1000
      })
      return Promise.reject(new Error('账号状态异常，请联系管理员'))
    }

    // AI接口或其他接口兼容处理
    const isSuccess = res.code === 1 || res.success === true
    if (!isSuccess) {
      console.error('API错误:', res)
      Message({
        message: res.msg || res.error || '系统错误',
        type: 'error',
        duration: 5 * 1000
      })
      return Promise.reject(new Error(res.msg || res.error || '系统错误'))
    }

    // 成功返回
    return response
  },
  error => {
    console.log('err', error)
    let message = error.message
    
    // JWT特有：处理401和403错误
    if (error.response) {
      if (error.response.status === 401) {
        removeToken()
        Message({
          message: '认证已过期，请重新登录',
          type: 'warning',
          duration: 2000
        })
        router.replace('/login')
        return Promise.reject(new Error('认证已过期，请重新登录'))
      }
      
      if (error.response.status === 403) {
        Message({
          message: '没有权限访问该资源',
          type: 'warning',
          duration: 2000
        })
        return Promise.reject(new Error('没有权限访问该资源'))
      }
    }
    
    // 特殊处理获取用户信息接口
    if (error.config && error.config.url.includes('/users/info')) {
      console.log('获取用户信息时出错，使用默认信息:', error)
      // 返回一个成功的响应，避免登录流程中断
      return {
        data: {
          code: 1,
          msg: '模拟用户信息',
          data: {
            username: localStorage.getItem('username') || 'Guest User',
            avatar: '',
            status: 1
          }
        },
        status: 200
      }
    }

    if (message === 'Network Error') {
      message = '后端接口连接异常'
    } else if (message.includes('timeout')) {
      message = '系统接口请求超时'
    } else if (message.includes('Request failed with status code')) {
      message = '系统接口' + message.slice(-3) + '异常'
    }

    Message({
      message,
      type: 'error',
      duration: 5 * 1000
    })

    return Promise.reject(error)
  }
)

export default service
